package main

import (
	"sort"
	"fmt"
)

//Go的sort包实现了内置和用户定义类型的排序

//为了通过Go中的自定义函数进行排序，创建了一个byLength 只是内建[]string 类型的别名的类型
//在我们的类型上实现sort接口 Len，Less和 Swap 并且Less会保存实际的自定义排序逻辑,增加字符串长度的顺序排序
type byLength []string

func (s byLength) Len() int {
	return len(s)
}
func (s byLength) Swap(i, j int) {
	s[i], s[j] = s[j], s[i]
}
func (s byLength) Less(i, j int) bool {
	return len(s[i]) < len(s[j])
}

func main() {

	//排序是会更改给定的切片并且不会返回新的切片
	strs := []string{"c", "a", "b"}
	sort.Strings(strs)
	fmt.Println("Strings:", strs)

	ints := []int{7, 2, 4}
	sort.Ints(ints)
	fmt.Println("Ints:   ", ints)

	//检查切片是否已经排序
	s := sort.IntsAreSorted(ints)
	fmt.Println("Sorted: ", s)

	//有时候会想通过非自然顺序排序集合
	//例如，假设我们想按字符串的长度对字符串进行排序而不是按字母顺序排列
	fruits := []string{"peach", "banana", "kiwi"}
	//可以通过将原始fruits切片投射到该切片上来 实现我们的自定义排序byLength
	sort.Sort(byLength(fruits))
	//通过遵循这种创建自定义类型的模式，Interface在该类型上实现三种方法
	//然后在该自定义类型的集合上调用sort.Sort，可以通过任意函数对Go切片进行排序
	fmt.Println(fruits)
}
